package br.edu.ifrn.sgp.resources;

import java.util.ArrayList;
import java.util.Collection;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;

import br.edu.ifrn.sgp.arq.util.ValidatorUtil;
import br.edu.ifrn.sgp.dtos.ArquivoProcessoDTO;
import br.edu.ifrn.sgp.dtos.CampusDTO;
import br.edu.ifrn.sgp.dtos.DocumentoDTO;
import br.edu.ifrn.sgp.dtos.HistoricoStatusProcessoDTO;
import br.edu.ifrn.sgp.dtos.PessoaDTO;
import br.edu.ifrn.sgp.dtos.ProcessoDTO;
import br.edu.ifrn.sgp.dtos.TramitacaoProcessoDTO;
import br.edu.ifrn.sgp.dtos.UnidadeDTO;
import br.edu.ifrn.sgp.dtos.UsuarioDTO;
import br.edu.ifrn.sgp.protocolo.dao.ProcessoDAO;
import br.edu.ifrn.sgp.protocolo.dominio.ArquivoProcesso;
import br.edu.ifrn.sgp.protocolo.dominio.Documento;
import br.edu.ifrn.sgp.protocolo.dominio.HistoricoStatusProcesso;
import br.edu.ifrn.sgp.protocolo.dominio.Processo;
import br.edu.ifrn.sgp.protocolo.dominio.TramitacaoProcesso;

@Path("/processo")
public class ProcessoResource {
	
	@GET
	@Path("/processosUsuario")
    @Produces("application/json")
    public Response getProcessosUsuario(@QueryParam("idUsuario") String idUsuario){
		
		Response response;
		ProcessoDAO dao = new ProcessoDAO();
		Integer id = Integer.parseInt(idUsuario);
		
		Collection<Processo> processos = dao.findGeral(null, null, null, null, null, null, null, null, null, false,
				id, null, null, null, null);
		
		if (ValidatorUtil.isEmpty(processos)){
			response = Response.status(Response.Status.OK).entity(null).build();
			return response;
		}
		
		Collection<ProcessoDTO> result = new ArrayList<ProcessoDTO>();
		
		for (Processo proc : processos){
			ProcessoDTO dto = new ProcessoDTO();
			dto.setId(proc.getId());
			dto.setAnoProtocolo(proc.getAnoProtocolo());
			dto.setNumeroProtocolo(proc.getNumeroProtocolo());
			dto.setRadicalProtocolo(proc.getRadicalProtocolo());
			dto.setDvProtocolo(proc.getDvProtocolo());
//			dto.setInteressado(new UsuarioDTO());
//			dto.getInteressado().setId(proc.getInteressado().getId());
//			dto.getInteressado().setPessoa(new PessoaDTO());
//			dto.getInteressado().getPessoa().setNome(proc.getInteressado().getPessoa().getNome());
//			dto.setCriadoEm(proc.getCriadoEm());
//			dto.setCriadoPor(new UsuarioDTO());
//			dto.getCriadoPor().setId(proc.getCriadoPor().getId());
//			dto.getCriadoPor().setPessoa(new PessoaDTO());
//			dto.getCriadoPor().getPessoa().setNome(proc.getCriadoPor().getPessoa().getNome());
			dto.setAssunto(proc.getAssunto());
//			dto.setObservacao(proc.getObservacao());
//			dto.setUnidadeOrigem(new UnidadeDTO());
//			dto.getUnidadeOrigem().setNome(proc.getUnidadeOrigem().getNome());
//			dto.getUnidadeOrigem().setCampus(new CampusDTO());
//			dto.getUnidadeOrigem().getCampus().setNome(proc.getUnidadeOrigem().getCampus().getNome());
//			dto.setStatus(proc.getStatus().toString());
			
//			if (ValidatorUtil.isNotEmpty(proc.getAtualizadoEm())){
//				dto.setAtualizadoEm(proc.getAtualizadoEm());
//			}
//			
//			if (ValidatorUtil.isNotEmpty(proc.getAtualizadoPor())){
//				dto.setAtualizadoPor(new UsuarioDTO());
//				dto.getAtualizadoPor().setId(proc.getAtualizadoPor().getId());
//				dto.getAtualizadoPor().setPessoa(new PessoaDTO());
//				dto.getAtualizadoPor().getPessoa().setNome(proc.getAtualizadoPor().getPessoa().getNome());
//			}
			
			result.add(dto);
		}
		
    	return response = Response.status(Response.Status.OK).entity(result).build();
    }
	
	@GET
    @Produces("application/json")
    public Response getProcesso(@QueryParam("idProcesso") String idProcesso){
		
		Response response;
		ProcessoDAO dao = new ProcessoDAO();
		Integer id = Integer.parseInt(idProcesso);
		
		Processo proc = dao.findByPrimaryKey(id, Processo.class);
		proc.setHistoricoStatus(dao.findByExactField("processo.id", id, HistoricoStatusProcesso.class));
		proc.setTramitacoes(dao.findByExactField("processo.id", id, TramitacaoProcesso.class));
		
		if (ValidatorUtil.isEmpty(proc)){
			response = Response.status(Response.Status.OK).entity(null).build();
			return response;
		}
		
		ProcessoDTO dto = new ProcessoDTO();
		dto.setId(proc.getId());
		dto.setAnoProtocolo(proc.getAnoProtocolo());
		dto.setNumeroProtocolo(proc.getNumeroProtocolo());
		dto.setRadicalProtocolo(proc.getRadicalProtocolo());
		dto.setDvProtocolo(proc.getDvProtocolo());
		dto.setInteressado(new UsuarioDTO());
		dto.getInteressado().setId(proc.getInteressado().getId());
		dto.getInteressado().setPessoa(new PessoaDTO());
		dto.getInteressado().getPessoa().setNome(proc.getInteressado().getPessoa().getNome());
		dto.setCriadoEm(proc.getCriadoEm());
		dto.setCriadoPor(new UsuarioDTO());
		dto.getCriadoPor().setId(proc.getCriadoPor().getId());
		dto.getCriadoPor().setPessoa(new PessoaDTO());
		dto.getCriadoPor().getPessoa().setNome(proc.getCriadoPor().getPessoa().getNome());
		dto.setAssunto(proc.getAssunto());
		dto.setObservacao(proc.getObservacao());
		dto.setUnidadeOrigem(new UnidadeDTO());
		dto.getUnidadeOrigem().setNome(proc.getUnidadeOrigem().getNome());
		dto.getUnidadeOrigem().setCampus(new CampusDTO());
		dto.getUnidadeOrigem().getCampus().setNome(proc.getUnidadeOrigem().getCampus().getNome());
		dto.setStatus(proc.getStatus().toString());
		dto.setPublico(proc.isPublico());
	
		if (ValidatorUtil.isNotEmpty(proc.getAtualizadoEm())){
			dto.setAtualizadoEm(proc.getAtualizadoEm());
		}
		
		if (ValidatorUtil.isNotEmpty(proc.getAtualizadoPor())){
			dto.setAtualizadoPor(new UsuarioDTO());
			dto.getAtualizadoPor().setId(proc.getAtualizadoPor().getId());
			dto.getAtualizadoPor().setPessoa(new PessoaDTO());
			dto.getAtualizadoPor().getPessoa().setNome(proc.getAtualizadoPor().getPessoa().getNome());
		}
		
		if (ValidatorUtil.isNotEmpty(proc.getDocumentos())){
			dto.setDocumentos(new ArrayList<DocumentoDTO>());
			
			for (Documento doc : proc.getDocumentos()){
				dto.getDocumentos().add(DTOHelper.documentoToDTO(doc));
			}
		}
		
		if (ValidatorUtil.isNotEmpty(proc.getArquivosProcesso())){
			dto.setArquivosProcesso(new ArrayList<ArquivoProcessoDTO>());
			
			for (ArquivoProcesso arq : proc.getArquivosProcesso()){
				dto.getArquivosProcesso().add(DTOHelper.arquivoProcessoToDTO(arq));
			}
		}
		
		if (ValidatorUtil.isNotEmpty(proc.getHistoricoStatus())){
			dto.setHistoricoStatus(new ArrayList<HistoricoStatusProcessoDTO>());
			
			for (HistoricoStatusProcesso hist : proc.getHistoricoStatus()){
				dto.getHistoricoStatus().add(DTOHelper.historicoStatusProcessoToDTO(hist));
			}
		}
		
		if (ValidatorUtil.isNotEmpty(proc.getTramitacoes())){
			dto.setTramitacoes(new ArrayList<TramitacaoProcessoDTO>());
			
			for (TramitacaoProcesso tram : proc.getTramitacoes()){
				dto.getTramitacoes().add(DTOHelper.tramitacaoProcessoToDTO(tram));
			}
		}
		
		
    	return response = Response.status(Response.Status.OK).entity(dto).build();
    }
}
